Micron Document
baubs git

Node / mirrors / respira / files / src / stores / storeEvents.ts

Displaying Raw • Download

src/stores/storeEvents.ts copilot/create-shared-infocard-component (7c3f79ae) Text, 1.69 KB

/**
* Store Events
*
* Zustand-based event store for cross-store communication without tight coupling.
* Uses Zustand's built-in subscription system to emit and react to events.
*/

import { create } from "zustand";

interface EventState {
// Event counters - incrementing these triggers subscriptions
patternDeletedCount: number;

// Actions to emit events
emitPatternDeleted: () => void;
}

/**
* Event store using Zustand for cross-store communication.
* Stores can emit events by calling actions, and subscribe to events using Zustand's subscribe.
*/
export const useEventStore = create<EventState>((set) => ({
patternDeletedCount: 0,

emitPatternDeleted: () => {
set((state) => ({ patternDeletedCount: state.patternDeletedCount + 1 }));
},
}));

/**
* Subscribe to the pattern deleted event.
*
* The subscription remains active until the returned unsubscribe function is called.
* If the unsubscribe function is not called, the listener will persist for the
* lifetime of the event store (typically the lifetime of the application).
*
* Call the returned unsubscribe function when the listener is no longer needed,
* especially for short-lived components or non-module-level subscriptions.
*
* @param callback - Function to call when the event is emitted.
* @returns Unsubscribe function that removes the listener when invoked.
*/
export const onPatternDeleted = (callback: () => void): (() => void) => {
let prevCount = useEventStore.getState().patternDeletedCount;

return useEventStore.subscribe((state) => {
if (state.patternDeletedCount !== prevCount) {
prevCount = state.patternDeletedCount;
callback();
}
});
};

Served by rngit 1.3.3 - Generated in 0.06s